home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / utility / cbhd502 / src / m2 / scsistre.m < prev    next >
Text File  |  1997-01-21  |  12KB  |  392 lines

  1. IMPLEMENTATION MODULE ScsiStreamer;
  2.  
  3. (****************************************************************************
  4.  *
  5.  *
  6.  * $Source: E:\HM2\LIB\se\rcs\scsistre.m,v $
  7.  *
  8.  * $Revision: 1.1 $
  9.  *
  10.  * $Author: S_Engel $
  11.  *
  12.  * $Date: 1996/02/03 19:34:50 $
  13.  *
  14.  * $State: Exp $
  15.  *
  16.  *****************************************************************************
  17.  * History:
  18.  *
  19.  * $Log: scsistre.m,v $
  20.  * Revision 1.1  1996/02/03  19:34:50  S_Engel
  21.  * Initial revision
  22.  *
  23.  *
  24.  *
  25.  ****************************************************************************)
  26.  
  27.  
  28. (* Systemabhängiges *)
  29. (* IMPLEMENTATION FÜR  >>> Hänisch-Modula-2 <<< *)
  30. (*                                              *)
  31. (* Durchgeführt von Steffen Engel               *)
  32. (*                                              *)
  33. (*$S-   Stack-Checks                            *)
  34. (*$I-   keine Variablen-Initialisierung         *)
  35. (*$V-   keine arithmetischen Kontrollen         *)
  36. (*$T-   kein Bereichstest                       *)
  37. (*$Y-   keine Laufzeittests auf RETURN und CASE *)
  38. (*                                              *)
  39. (*----------------------------------------------*)
  40.  
  41.  
  42. IMPORT SYSTEM, System;
  43. FROM SYSTEM   (* Type  *) IMPORT BYTE, ADDRESS,
  44.               (* Proc  *) ADR, TSIZE;
  45.  
  46. FROM Portab IMPORT UChar, Char;
  47.  
  48. (* Standard HM2-Libs *)
  49.  
  50. (* Eigene Libs *)
  51.  
  52. (* Projektlibs *)
  53. IMPORT Scsi, ScsiIO;
  54. FROM Scsi IMPORT Cmd6, Cmd10, Cmd12, SetCmd6, SetCmd10, SetCmd12, SetCmd,
  55.           BlockLen, MaxDmaLen, LogicalUnit;
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62. (***************************************************************************)
  63. (*-                                                                       -*)
  64. (*- Sequential Access Devices                                             -*)
  65. (*-                                                                       -*)
  66. (***************************************************************************)
  67.  
  68. PROCEDURE Read(TransferLen:SHORTCARD;Adr:ADDRESS; Timeout : LONGCARD) : BOOLEAN;
  69. VAR
  70.   Ok      : BOOLEAN;
  71.   MaxLen  : LONGCARD;
  72.   SCmd    : ScsiIO.tSCSICmd;
  73.  
  74. BEGIN
  75.   Ok:=TRUE;
  76.  
  77.   MaxLen := MaxDmaLen DIV BlockLen;
  78.  
  79.   WHILE Ok AND (TransferLen > MaxLen) DO
  80.     VOID(SetCmd6(Cmd6, 008H, 010000H + MaxLen DIV 256, MaxLen MOD 256));
  81.     Ok := ScsiIO.In(SetCmd(SCmd, Cmd6, Adr, VAL(LONGCARD, MaxLen) * BlockLen, Timeout * 200)) = 0;
  82.     DEC(TransferLen, MaxLen);
  83.     Adr := Adr + VAL(LONGCARD, MaxLen) * BlockLen;
  84.   END;
  85.   VOID(SetCmd6(Cmd6, 008H, 010000H + TransferLen DIV 256, TransferLen MOD 256));
  86.   RETURN Ok AND(ScsiIO.In(SetCmd(SCmd, Cmd6, Adr, BlockLen * VAL(LONGCARD, TransferLen), Timeout * 200)) = 0);
  87. END Read;
  88.  
  89. PROCEDURE ReadNum(VAR TransferLen:SHORTCARD; Adr:ADDRESS; Timeout : LONGCARD) : BOOLEAN;
  90. VAR Ok : BOOLEAN;
  91.     Read : SHORTCARD;
  92.     MaxLen : LONGCARD;
  93.   SCmd  : ScsiIO.tSCSICmd;
  94.   
  95. BEGIN
  96.   Ok:=TRUE;
  97.   Read := 0;
  98.  
  99.   MaxLen := MaxDmaLen DIV BlockLen;
  100.  
  101.   WHILE Ok AND (TransferLen > MaxLen) DO
  102.     VOID(SetCmd6(Cmd6, 008H, 010000H+MaxLen DIV 256, MaxLen MOD 256));
  103.     Ok := ScsiIO.In(SetCmd(SCmd, Cmd6, Adr, VAL(LONGCARD, MaxLen) * BlockLen, Timeout * 200)) = 0;
  104.     DEC(TransferLen, MaxLen);
  105.     INC(Read, MaxLen);
  106.     Adr := Adr + VAL(LONGCARD, MaxLen) * BlockLen;
  107.   END;
  108.  
  109.   VOID(SetCmd6(Cmd6, 008H, 010000H + TransferLen DIV 256, TransferLen MOD 256));
  110.   IF Ok
  111.     THEN
  112.       Ok := ScsiIO.In(SetCmd(SCmd, Cmd6, Adr, BlockLen * VAL(LONGCARD, TransferLen), Timeout * 200)) = 0;
  113.       INC(Read, TransferLen);
  114.     END;
  115.   TransferLen := Read;
  116.   RETURN Ok;
  117. END ReadNum;
  118.  
  119. PROCEDURE Write(TransferLen:SHORTCARD;Adr:ADDRESS;Timeout : LONGCARD) : BOOLEAN;
  120. VAR Ok : BOOLEAN;
  121.     MaxLen : LONGCARD;
  122.   SCmd  : ScsiIO.tSCSICmd;
  123.   
  124. BEGIN
  125.   Ok:=TRUE;
  126.   MaxLen := MaxDmaLen DIV BlockLen;
  127.   WHILE Ok AND (TransferLen > MaxLen) DO
  128.     VOID(SetCmd6(Cmd6, 00AH, 010000H + MaxLen DIV 256, MaxLen MOD 256));
  129.     Ok := ScsiIO.Out(SetCmd(SCmd, Cmd6, Adr, VAL(LONGCARD, MaxLen) * BlockLen, Timeout * 200)) = 0;
  130.     DEC(TransferLen, MaxLen);
  131.     Adr := Adr + VAL(LONGCARD, MaxLen) * BlockLen;
  132.   END;
  133.   VOID(SetCmd6(Cmd6, 00AH, 010000H+TransferLen DIV 256, TransferLen MOD 256));
  134.   RETURN Ok AND (ScsiIO.Out(SetCmd(SCmd, Cmd6, Adr, BlockLen * VAL(LONGCARD, TransferLen), Timeout * 200)) = 0);
  135. END Write;
  136.  
  137. PROCEDURE WriteNum(VAR TransferLen:SHORTCARD;Adr:ADDRESS;Timeout : LONGCARD) : BOOLEAN;
  138. VAR
  139.   Ok      : BOOLEAN;
  140.   Written : SHORTCARD;
  141.   MaxLen : SHORTCARD;
  142.   SCmd  : ScsiIO.tSCSICmd;
  143.  
  144. BEGIN
  145.   Ok:=TRUE;
  146.   Written := 0;
  147.   MaxLen := MaxDmaLen DIV BlockLen;
  148.   WHILE Ok AND (TransferLen > MaxLen) DO
  149.     VOID(SetCmd6(Cmd6, 00AH, 010000H + MaxLen DIV 256, MaxLen MOD 256));
  150.     Ok := ScsiIO.Out(SetCmd(SCmd, Cmd6, Adr, VAL(LONGCARD, MaxLen) * BlockLen, Timeout * 200)) = 0;
  151.     DEC(TransferLen, MaxLen);
  152.     INC(Written, MaxLen);
  153.     Adr := Adr + VAL(LONGCARD, MaxLen) * BlockLen;
  154.   END;
  155.   VOID(SetCmd6(Cmd6, 00AH, 010000H + TransferLen DIV 256, TransferLen MOD 256));
  156.   IF Ok
  157.     THEN
  158.       INC(Written, TransferLen);
  159.       Ok := ScsiIO.Out(SetCmd(SCmd, Cmd6, Adr, BlockLen * VAL(LONGCARD, TransferLen), Timeout * 200)) = 0;
  160.     END;
  161.   TransferLen := Written;
  162.   RETURN Ok;
  163. END WriteNum;
  164.  
  165. PROCEDURE Erase(TimeoutSeconds : LONGCARD) : BOOLEAN;
  166. VAR
  167.   SCmd  : ScsiIO.tSCSICmd;
  168.     
  169. BEGIN
  170.   VOID(SetCmd6(Cmd6, 019H,010000H,0));
  171.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, TimeoutSeconds * 200)) = 0;
  172. END Erase;
  173.  
  174. PROCEDURE Load(Imed, Ret, Eot, Load:BOOLEAN;
  175.                TimeoutSeconds:LONGCARD) : BOOLEAN;
  176. VAR
  177.   SCmd  : ScsiIO.tSCSICmd;
  178.  
  179. BEGIN
  180.   VOID(SetCmd6(Cmd6, 01BH,0,0));
  181.   WITH Cmd6 DO
  182.     IF Imed THEN
  183.       LunAdr:=BYTE(VAL(CHAR, LogicalUnit+1));
  184.     ELSE
  185.     END;
  186.     IF Load THEN
  187.       Len := 1;
  188.     END;
  189.     IF Ret THEN
  190.       Len := UChar(VAL(CHAR,VAL(SHORTCARD, CHAR(Len))+2));
  191.     END;
  192.     IF Eot THEN
  193.       Flags:=BYTE(080H);
  194.     END;
  195.   END;
  196.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, TimeoutSeconds * 200)) = 0;
  197.  
  198. END Load;
  199.  
  200. PROCEDURE WriteFilemark(Imed : BOOLEAN; Number : SHORTCARD; Timeout : LONGCARD) : BOOLEAN;
  201. VAR
  202.   SCmd  : ScsiIO.tSCSICmd;
  203.  
  204. BEGIN
  205.   VOID(SetCmd6(Cmd6, 010H,0,Number));
  206.   IF Imed THEN
  207.     Cmd6.Flags:=BYTE(040H);
  208.   END;
  209.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, Timeout * 200)) = 0;
  210. END WriteFilemark;
  211.  
  212. PROCEDURE Space(Code : SHORTCARD; Count : LONGINT;
  213.                 TimeoutSeconds : LONGCARD) : BOOLEAN;
  214.  
  215. VAR
  216.   Ok          : BOOLEAN;
  217.   SCmd  : ScsiIO.tSCSICmd;
  218.     
  219. BEGIN
  220.   WITH Cmd6 DO
  221.     Command := (011H);
  222.     LunAdr:=BYTE(VAL(CHAR,LogicalUnit + Code MOD 8));
  223.     Adr:=VAL(SHORTCARD, LONGCARD(Count) DIV 0100H);
  224.     Len := VAL(UChar, LONGCARD(Count) MOD 0100H);
  225.     Flags:=BYTE(0);
  226.   END;
  227.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, TimeoutSeconds * 200)) = 0;
  228. END Space;
  229.  
  230. PROCEDURE Rewind(Imed : BOOLEAN; TimeoutSeconds : LONGCARD) : BOOLEAN;
  231. VAR
  232.   SCmd  : ScsiIO.tSCSICmd;
  233.  
  234. BEGIN
  235.   VOID(SetCmd6(Cmd6, 001H,0,0));
  236.   IF Imed THEN
  237.     Cmd6.LunAdr:=BYTE(VAL(CHAR,LogicalUnit+1));
  238.   END;
  239.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, TimeoutSeconds * 200)) = 0;
  240. END Rewind;
  241.  
  242. (*-------------------------------------------------------------------------*)
  243. (*-                                                                       -*)
  244. (*- Quick File Access                                                     -*)
  245. (*-                                                                       -*)
  246. (*-------------------------------------------------------------------------*)
  247. PROCEDURE SeekBlock(Imed : BOOLEAN;
  248.                     BlockAdr,TimeoutSeconds : LONGCARD) : BOOLEAN;
  249. VAR
  250.   Ok          : BOOLEAN;
  251.   SCmd  : ScsiIO.tSCSICmd;
  252.     
  253. BEGIN
  254.   VOID(SetCmd6(Cmd6, 00CH,VAL(SHORTCARD, BlockAdr DIV 0100H),
  255.                    VAL(SHORTCARD, BlockAdr MOD 0100H)));
  256.   IF Imed THEN
  257.     Cmd6.LunAdr:=BYTE(VAL(CHAR,LogicalUnit+1));
  258.   END;
  259.   RETURN ScsiIO.In(SetCmd(SCmd, Cmd6, NIL, 0, TimeoutSeconds * 200)) = 0;
  260. END SeekBlock;
  261.  
  262. PROCEDURE RequestBlockAdr(VAR BlockAdr : LONGCARD) : BOOLEAN;
  263.  
  264. VAR
  265.   Ok : BOOLEAN;
  266.   SCmd  : ScsiIO.tSCSICmd;
  267.  
  268. BEGIN
  269.   VOID(SetCmd6(Cmd6, 002H, 0, 3));
  270.   (* Daten in die oberen 3 Bytes von BlockAdr einlesen *)
  271.   Ok := ScsiIO.In(SetCmd(SCmd, Cmd6, ADR(BlockAdr), 3, ScsiIO.DefTimeout)) = 0;
  272.   (* Daten an richtige Position shiften *)
  273.   BlockAdr:=BlockAdr DIV 0100H;
  274.   RETURN Ok;
  275. END RequestBlockAdr;
  276.  
  277. PROCEDURE Locate(BlockAdresstype : BOOLEAN;
  278.                     ChangePartition : BOOLEAN;
  279.                     Imed            : BOOLEAN;
  280.                     BlockAdress     : LONGCARD;
  281.                     Partition       : SHORTCARD;
  282.                     TimeoutSeconds  : LONGCARD) : BOOLEAN;
  283.  
  284. TYPE tLoc = RECORD
  285.                  Command : BYTE;
  286.                  Lun     : BYTE;
  287.                  Res1    : BYTE;
  288.                  Adr3    : BYTE;
  289.                  Adr2    : BYTE;
  290.                  Adr1    : BYTE;
  291.                  Adr0    : BYTE;
  292.                  Res2    : BYTE;
  293.                  part    : BYTE;
  294.                  Flags   : BYTE; 
  295.                END;
  296.  
  297. VAR
  298.   Cmd         : tLoc;
  299.   OldTimeout  : LONGCARD;
  300.   Ok          : BOOLEAN;
  301.   SCmd  : ScsiIO.tSCSICmd;
  302.  
  303.   BEGIN
  304. (*    OldTimeout := ScsiIO.GetTimeout();*)
  305. (*    ScsiIO.SetTimeout(TimeoutSeconds * 100);*)
  306.     (* Kommandoblock zusammensetzen *)
  307.     WITH Cmd DO
  308.       Command:=BYTE(02BH);
  309.       Lun:=BYTE(VAL(CHAR,LogicalUnit));
  310.  
  311.       IF BlockAdresstype
  312.         THEN
  313.           (* Bit setzen *)
  314.           Lun := BYTE(VAL(CHAR,VAL(SHORTCARD, CHAR(Lun)) + 4));
  315.         END;
  316.       IF ChangePartition
  317.         THEN
  318.           (* Bit setzen *)
  319.           Lun := BYTE(VAL(CHAR,VAL(SHORTCARD, CHAR(Lun)) + 2));
  320.         END;
  321.       IF Imed
  322.         THEN
  323.           (* Bit setzen *)
  324.           Lun := BYTE(VAL(CHAR,VAL(SHORTCARD, CHAR(Lun)) + 1));
  325.         END;
  326.  
  327.       Res1 := BYTE( 0);
  328.       Adr3 := BYTE(VAL(CHAR, BlockAdress DIV 01000000H));
  329.       Adr2 := BYTE(VAL(CHAR, BlockAdress DIV 010000H MOD 0100H));
  330.       Adr1 := BYTE(VAL(CHAR, BlockAdress DIV 0100H MOD 0100H));
  331.       Adr0 := BYTE(VAL(CHAR, BlockAdress MOD 0100H));
  332.       Res2 := BYTE( 0);
  333.       part := BYTE(VAL(CHAR, Partition));
  334.       Flags:=BYTE(0);
  335.     END;
  336.     RETURN ScsiIO.In(SetCmd(SCmd, Cmd, NIL, 0, TimeoutSeconds * 200)) = 0;
  337. (*    Ok := ScsiIO.SendCmdDataIn(Cmd, 10, NIL, 0);*)
  338. (*    ScsiIO.SetTimeout(OldTimeout);*)
  339. (*    RETURN Ok;*)
  340.   END Locate;
  341.  
  342.  
  343. PROCEDURE ReadPosition(    BlockAdresstype : BOOLEAN;
  344.                           VAR Partition       : SHORTCARD;
  345.                           VAR BlockAdress     : LONGCARD) : BOOLEAN;
  346.  
  347. TYPE tPositionData = RECORD
  348.                        Flags     : BYTE;  (* BOP, EOP, Res, Res, Res, BDU, Res, Res *)
  349.                        part      : BYTE;
  350.                        Res1      : BYTE;
  351.                        Res2      : BYTE;
  352.                        FirstLoc  : LONGCARD;
  353.                        LastLoc   : LONGCARD;
  354.                        Res3      : BYTE;
  355.                        NBlBuff2  : BYTE;
  356.                        NBlBuff1  : BYTE;
  357.                        NBlBuff0  : BYTE;
  358.                        BuffBytes : LONGCARD;
  359.                      END;
  360. (*$? TSIZE(tPositionData) # 20 : Fragezeichen? *)
  361.  
  362.  
  363. VAR
  364.   PositionData : tPositionData;
  365.   Ok           : BOOLEAN;
  366.   SCmd  : ScsiIO.tSCSICmd;
  367.  
  368.   BEGIN
  369.     VOID(SetCmd10(Cmd10, 034H, 0, 0));
  370.     IF BlockAdresstype
  371.       THEN
  372.         (* Bit setzen *)
  373.         Cmd10.Lun := BYTE(VAL(CHAR, LogicalUnit + 1));
  374.       END;
  375.     Ok := ScsiIO.In(SetCmd(SCmd, Cmd10, ADR(PositionData), SIZE(PositionData), ScsiIO.DefTimeout)) = 0;
  376. (*    Ok := ScsiIO.SendCmdDataIn(Cmd10, 10, ADR(PositionData), SIZE(PositionData));*)
  377.  
  378.     WITH PositionData DO
  379.       Partition := VAL(SHORTCARD, CHAR(part));
  380.       BlockAdress := FirstLoc;
  381.     END;
  382.  
  383.     RETURN Ok;
  384.   END ReadPosition;
  385.  
  386.  
  387.  
  388.  
  389. BEGIN
  390.  
  391. END ScsiStreamer.
  392.